# -*- coding: utf-8 -*-
# Create your views here.

from django.shortcuts import RequestContext, render_to_response, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.conf import settings

from models import Pregao, ItemPregao, Proposta
from forms import (AbrirPregaoForm, ItensPregaoForm, ItensPregaoFormset, 
                   LanceForm)

@login_required
@user_passes_test(lambda u: u.has_perm('pregao.ver_abertos'))
def lista(request):
    p = None
    if not request.user.groups.filter(name='Comprador').exists():
        tudo = 0
    else:
        tudo = request.GET.get('tudo', None)
        if tudo is None:
            tudo = request.session.get('tudo', None)
    try:
        tudo = int(tudo)
    except (ValueError, TypeError):
        tudo = 0

    if tudo:
        request.session['tudo'] = tudo
        p = Pregao.objects.all()
    else:
        request.session['tudo'] = 0
        p = Pregao.objects.ativos()

    c = {'PVA': True, 'pregoes': p, 'tudo': tudo}
    return render_to_response('lista_pregao.html', c, RequestContext(request))

@login_required
@user_passes_test(lambda u: u.has_perm('pregao.ver_todos'))
def infos(request, id):
    p = get_object_or_404(Pregao, id=id)

    return render_to_response('infos_pregao.html', {'pregao': p, 'debug': settings.DEBUG}, RequestContext(request))

@login_required
@user_passes_test(lambda u: u.has_perm('pregao.can_add'))
def abrir(request):
    c = {'PCA':True}
    ap = None
    ip = None

    if request.method == 'POST':
        ap = AbrirPregaoForm(request.POST)
        ip = ItensPregaoFormset(request.POST)
        if ap.is_valid():
            pregao = ap.save(commit=False)
            ip = ItensPregaoFormset(request.POST, instance=pregao)
            if ip.is_valid():
                ap.save()
                ip.save()
                messages.success(request, u'%s cadastrado com sucesso!' % pregao)
                return HttpResponseRedirect(reverse('lista_pregao'))

    c['ap'] = ap or AbrirPregaoForm()
    c['ip'] = ip or ItensPregaoFormset()
    return render_to_response('abrir_pregao.html', c, RequestContext(request))

@login_required
@user_passes_test(lambda u: u.has_perm('fornecedor.is_fornecedor'))
def lance(request):
    c = {}
    form = None
    antigo_valor = None
    item_pregao = get_object_or_404(ItemPregao, id=request.GET.get('id'))

    proposta = item_pregao.proposta_set.filter(fornecedor=request.user.fornecedor)
    if proposta.exists():
        proposta = proposta[0]
    else:
        proposta = None

    if request.POST:
        if proposta:
            antigo_valor = proposta.valor
            form = LanceForm(request.POST, instance=proposta)
        else:
            form = LanceForm(request.POST, initial={'item': item_pregao})

        if form.is_valid():
            form.instance.fornecedor = request.user.fornecedor
            p = form.save()
            if not proposta:
                messages.success(request, 
                    u'Proposta de %s para o item %s cadastrado com sucesso!' % (p.valor, item_pregao.item))
            else:
                messages.success(request,
                    u'Proposta do item %s alterado de %s para %s' % (item_pregao.item, antigo_valor, p.valor))
            return HttpResponse('OK')

    if not form and proposta:
        form = LanceForm(instance=proposta)
    elif not form:
        form = LanceForm(initial={'item':item_pregao})

    c['proposta'] = proposta
    c['form'] = form
    c['item'] = item_pregao
    return render_to_response('inserir_proposta.html', c, RequestContext(request))

@login_required
@user_passes_test(lambda u: u.has_perm('pregao.can_classificar'))
def selecionar_propostas(request, id):
    pregao = get_object_or_404(Pregao, id=id)

    if request.POST:
        for item in pregao.itempregao_set.all():
            if item.can_selecionar_proposta():
                po = request.POST.get('item-%s' % item.id, None)
                if po != None:
                    p = get_object_or_404(Proposta, id=po)
                    p.selecionar()
        messages.success(request, u'Propostas selecionadas com sucesso!!')
        return HttpResponseRedirect(reverse('lista_pregao'))

    messages.error(request, u'Você não pode selecionar propostas do pregão %s.' % pregao)
    return HttpResponseRedirect(reverse('lista_pregao'))

@login_required
@user_passes_test(lambda u: u.has_perm('pregao.can_classificar'))
def classificar(request, id):
    pregao = get_object_or_404(Pregao, id=id)
    if pregao.can_classificar():
        pregao.classificar_propostas()
        messages.success(request, u'Propostas do pregão %s foram classificadas com sucesso!' % pregao)
        return HttpResponseRedirect(reverse('lista_pregao'))

    messages.error(request, u'O pregão %s não está pronto para ser classificado!' % pregao)
    return HttpResponseRedirect(reverse('lista_pregao'))


@login_required
@user_passes_test(lambda u: u.has_perm('pregao.can_classificar'))
def finalizar(request, id):
    pregao = get_object_or_404(Pregao, id=id)
    if pregao.is_ativo():
        pregao.finalizar()
        messages.success(request, u'Pregão %s finalizado com sucesso!' % pregao)
        return HttpResponseRedirect(reverse('lista_pregao'))

    messages.error(request, u'O pregão %s não pode ser finalizado.' % pregao)
    return HttpResponseRedirect(reverse('lista_pregao'))














